home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / mpp.lha / mpp / src / Parser.mi < prev    next >
Text File  |  1992-08-18  |  32KB  |  875 lines

  1. IMPLEMENTATION MODULE Parser;
  2.  
  3. IMPORT Positions, Errors, Scanner, Strings, System, SYSTEM;
  4.  
  5. (* 'mpp.ell' line 9 *)
  6.  
  7. FROM StdIO    IMPORT    WriteC;
  8. FROM Scanner    IMPORT    BeginScanner, CloseScanner;
  9. FROM Strings    IMPORT    AssignEmpty, Append;
  10. FROM Table    IMPORT    BeginLine, CloseLine, NewLine, Define, Translate, WriteLine;
  11.  
  12. CONST cTab    = 11C;
  13.  
  14. CONST xxEof = 0;
  15.  
  16. TYPE
  17.   xxtUnionPtr    = POINTER TO xxtUnion;
  18.   xxtUnion    = RECORD GlobalRecoverySet: xxtUnionPtr; LocalRecoverySet: SHORTCARD; END;
  19.   xxtSet    = ARRAY [0..0] OF BITSET;
  20.  
  21. VAR
  22.   xxToken        : SHORTCARD;
  23.   xxErrorCount        : INTEGER;
  24.   xxIsInitialized    : BOOLEAN;
  25.   xxIsRepairMode    : BOOLEAN;
  26.   xxHorizontalSet    : ARRAY [0..25] OF xxtSet;
  27.   xxVerticalSet0    : ARRAY [0..12] OF BITSET;
  28.  
  29. PROCEDURE xxTokenName (Token: CARDINAL; VAR Name: ARRAY OF CHAR);
  30.   PROCEDURE Copy (Source: ARRAY OF CHAR; VAR Target: ARRAY OF CHAR);
  31.     VAR i, j: CARDINAL;
  32.     BEGIN
  33.       IF HIGH (Source) < HIGH (Target)
  34.       THEN j := HIGH (Source); ELSE j := HIGH (Target); END;
  35.       FOR i := 0 TO j DO Target [i] := Source [i]; END;
  36.       IF HIGH (Target) > j THEN Target [j + 1] := CHR (0); END;
  37.     END Copy;
  38.   BEGIN
  39.     CASE Token OF
  40.     | 0: Copy ('_EndOfFile', Name);
  41.     | 1: Copy (' ', Name);
  42.     | 2: Copy ('^', Name);
  43.     | 3: Copy ('%', Name);
  44.     | 4: Copy ('$', Name);
  45.     | 5: Copy ('.', Name);
  46.     | 6: Copy ('\', Name);
  47.     | 7: Copy ('{', Name);
  48.     | 8: Copy ('}', Name);
  49.     | 9: Copy ('nl', Name);
  50.     | 10: Copy ('bnl', Name);
  51.     | 11: Copy ('char', Name);
  52.     | 12: Copy ('tab', Name);
  53.     END;
  54.   END xxTokenName;
  55.  
  56. PROCEDURE Parser (): INTEGER;
  57.   BEGIN
  58.     xxErrorCount := 0;
  59.     BeginParser;
  60.     xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  61.     yyinput (ParsAttribute, NIL);
  62.     IF xxToken # xxEof THEN xxRecoveryLiteral (xxEof, 0, NIL); END;
  63.     RETURN xxErrorCount;
  64.   END Parser;
  65.  
  66. PROCEDURE xxIsElement (VAR Set: xxtSet; Element: SHORTCARD): BOOLEAN;
  67.   BEGIN
  68.     RETURN Element MOD 32 IN Set [Element DIV 32];
  69.   END xxIsElement;
  70.  
  71. PROCEDURE xxUnexpected (LocalRecoverySet: SHORTCARD; GlobalRecoverySet: xxtUnionPtr);
  72.   BEGIN
  73.     IF NOT xxIsRepairMode THEN
  74.       INC (xxErrorCount);
  75.       Errors.ErrorMessage (Errors.SyntaxError, Errors.Error, Scanner.Attribute.Position);
  76.       xxSkipTokens (LocalRecoverySet, GlobalRecoverySet);
  77.     END;
  78.   END xxUnexpected;
  79.  
  80. PROCEDURE xxExpected (ExpectedSet: SHORTCARD; LocalRecoverySet: SHORTCARD; GlobalRecoverySet: xxtUnionPtr);
  81.   VAR
  82.     Token        : SHORTCARD;
  83.     TokenArray        : ARRAY [0..127] OF CHAR;
  84.     TokenString        : Strings.tString;
  85.     ContinueString    : Strings.tString;
  86.   BEGIN
  87.     IF NOT xxIsRepairMode THEN
  88.       INC (xxErrorCount);
  89.       Errors.ErrorMessage (Errors.SyntaxError, Errors.Error, Scanner.Attribute.Position);
  90.       Strings.AssignEmpty (ContinueString);
  91.       FOR Token := 0 TO 12 DO
  92.         IF xxIsElement (xxHorizontalSet [ExpectedSet], Token) THEN
  93.       xxTokenName (Token, TokenArray);
  94.       Strings.ArrayToString (TokenArray, TokenString);
  95.       IF (Strings.Length (ContinueString) + Strings.Length (TokenString) + 1 <= Strings.cMaxStrLength) THEN
  96.         Strings.Concatenate (ContinueString, TokenString);
  97.         Strings.Append (ContinueString, ' ');
  98.       END;
  99.         END;
  100.       END;
  101.       Errors.ErrorMessageI (Errors.ExpectedTokens, Errors.Information, Scanner.Attribute.Position, Errors.String, SYSTEM.ADR (ContinueString));
  102.       xxSkipTokens (LocalRecoverySet, GlobalRecoverySet);
  103.     END;
  104.   END xxExpected;
  105.  
  106. PROCEDURE xxRecoveryLiteral (Expected: SHORTCARD; LocalRecoverySet: SHORTCARD; GlobalRecoverySet: xxtUnionPtr);
  107.   VAR TokenString: ARRAY [0..127] OF CHAR;
  108.   BEGIN
  109.     IF NOT xxIsRepairMode THEN
  110.       INC (xxErrorCount);
  111.       Errors.ErrorMessage (Errors.SyntaxError, Errors.Error, Scanner.Attribute.Position);
  112.       xxTokenName (Expected, TokenString);
  113.       Errors.ErrorMessageI (Errors.ExpectedTokens, Errors.Information, Scanner.Attribute.Position, Errors.Array, SYSTEM.ADR (TokenString));
  114.       xxSkipTokens (LocalRecoverySet, GlobalRecoverySet);
  115.     END;
  116.     IF xxToken # Expected THEN
  117.       xxTokenName (Expected, TokenString);
  118.       Errors.ErrorMessageI (Errors.TokenInserted, Errors.Repair, Scanner.Attribute.Position, Errors.Array, SYSTEM.ADR (TokenString));
  119.     ELSE
  120.       IF xxToken # xxEof THEN xxToken := Scanner.GetToken (); END;
  121.       xxIsRepairMode := FALSE;
  122.     END;
  123.   END xxRecoveryLiteral;
  124.  
  125. PROCEDURE xxRecoveryTerminal (Expected: SHORTCARD; LocalRecoverySet: SHORTCARD; GlobalRecoverySet: xxtUnionPtr; VAR RepairAttribute: Scanner.tScanAttribute);
  126.   VAR TokenString: ARRAY [0..127] OF CHAR;
  127.   BEGIN
  128.     IF NOT xxIsRepairMode THEN
  129.       INC (xxErrorCount);
  130.       Errors.ErrorMessage (Errors.SyntaxError, Errors.Error, Scanner.Attribute.Position);
  131.       xxTokenName (Expected, TokenString);
  132.       Errors.ErrorMessageI (Errors.ExpectedTokens, Errors.Information, Scanner.Attribute.Position, Errors.Array, SYSTEM.ADR (TokenString));
  133.       xxSkipTokens (LocalRecoverySet, GlobalRecoverySet);
  134.     END;
  135.     IF xxToken # Expected THEN
  136.       xxTokenName (Expected, TokenString);
  137.       Errors.ErrorMessageI (Errors.TokenInserted, Errors.Repair, Scanner.Attribute.Position, Errors.Array, SYSTEM.ADR (TokenString));
  138.       Scanner.ErrorAttribute (Expected, RepairAttribute);
  139.     ELSE
  140.       RepairAttribute := Scanner.Attribute;
  141.       IF xxToken # xxEof THEN xxToken := Scanner.GetToken (); END;
  142.       xxIsRepairMode := FALSE;
  143.     END;
  144.   END xxRecoveryTerminal;
  145.  
  146. PROCEDURE xxSkipTokens (LocalRecoverySet: SHORTCARD; GlobalRecoverySet: xxtUnionPtr);
  147.   VAR RecoverySet: xxtSet;
  148.       TokensSkipped: BOOLEAN;
  149.   BEGIN
  150.     RecoverySet := xxHorizontalSet [LocalRecoverySet];
  151.     INCL (RecoverySet [0], xxEof);
  152.     WHILE GlobalRecoverySet # NIL DO
  153.       RecoverySet [0] := RecoverySet [0] + xxHorizontalSet [GlobalRecoverySet^.LocalRecoverySet] [0];
  154.       GlobalRecoverySet := GlobalRecoverySet^.GlobalRecoverySet;
  155.     END;
  156.     TokensSkipped := FALSE;
  157.     WHILE NOT xxIsElement (RecoverySet, xxToken) DO
  158.       xxToken := Scanner.GetToken ();
  159.       TokensSkipped := TRUE;
  160.     END;
  161.     IF TokensSkipped THEN
  162.       Errors.ErrorMessage (Errors.RestartPoint, Errors.Information, Scanner.Attribute.Position);
  163.     END;
  164.     xxIsRepairMode := TRUE;
  165.   END xxSkipTokens;
  166.  
  167. PROCEDURE BeginParser;
  168.   VAR
  169.     xxTableFile: System.tFile;
  170.     xxSize: CARDINAL;
  171.   BEGIN
  172.     IF xxIsInitialized THEN RETURN; END;
  173. (* 'mpp.ell' line 18 *)
  174.  BeginScanner; 
  175.     xxTableFile := System.OpenInput (ParsTabName);
  176.     IF xxTableFile < 0 THEN
  177.       Errors.ErrorMessage (Errors.ReadParseTable, Errors.Fatal, Positions.NoPosition);
  178.     END;
  179.     xxSize := System.Read (xxTableFile, SYSTEM.ADR (xxHorizontalSet), SIZE (xxHorizontalSet));
  180.     IF xxSize # SIZE (xxHorizontalSet) THEN
  181.       Errors.ErrorMessage (Errors.ReadParseTable, Errors.Fatal, Positions.NoPosition);
  182.     END;
  183.     xxSize := System.Read (xxTableFile, SYSTEM.ADR (xxVerticalSet0), SIZE (xxVerticalSet0));
  184.     IF xxSize # SIZE (xxVerticalSet0) THEN
  185.       Errors.ErrorMessage (Errors.ReadParseTable, Errors.Fatal, Positions.NoPosition);
  186.     END;
  187.     System.Close (xxTableFile);
  188.     xxIsInitialized := TRUE;
  189.   END BeginParser;
  190.  
  191. PROCEDURE CloseParser;
  192.   BEGIN
  193. (* 'mpp.ell' line 20 *)
  194.  CloseScanner; 
  195.   END CloseParser;
  196.  
  197. PROCEDURE yyinput (VAR input0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  198.   VAR
  199.     line1: tParsAttribute;
  200.     xxUnion: xxtUnion;
  201.   BEGIN
  202.     xxUnion.GlobalRecoverySet := xxGlobalRecoverySet;
  203.     LOOP
  204.       IF (0 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)) THEN
  205.         xxUnion.LocalRecoverySet := 0; yyline (line1, SYSTEM.ADR (xxUnion)); (*  *)
  206.       ELSIF (xxToken = 0 (* _EndOfFile *)) OR xxIsRepairMode THEN EXIT;
  207.       ELSE
  208.        
  209.       xxExpected (1, 1, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)
  210.       END;
  211.     END;
  212.   END yyinput;
  213.  
  214. PROCEDURE yyline (VAR line0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  215.   VAR
  216.     definition1: tParsAttribute;
  217.     usage1: tParsAttribute;
  218.     normal1: tParsAttribute;
  219.     xxUnion: xxtUnion;
  220.   BEGIN
  221.     xxUnion.GlobalRecoverySet := xxGlobalRecoverySet;
  222.     LOOP
  223.       CASE xxToken OF
  224.       | 5 (* '.' *):
  225.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  226.         LOOP
  227.           CASE xxToken OF
  228.           | 5 (* '.' *):
  229.             xxUnion.LocalRecoverySet := 0; yydefinition (definition1, SYSTEM.ADR (xxUnion)); (*  *)
  230.             EXIT;
  231.           | 0 (* _EndOfFile *), 1 (* ' ' *), 2 (* '^' *), 3 (* '%' *), 4 (* '$' *), 6 (* '\' *), 7 (* '{' *), 8 (* '}' *), 9 (* nl *), 10 (* bnl *), 11 (* char *), 12 (* tab *):
  232.             xxUnion.LocalRecoverySet := 0; yyusage (usage1, SYSTEM.ADR (xxUnion)); (*  *)
  233.             EXIT;
  234.           ELSE
  235.             IF xxIsRepairMode THEN
  236.               xxUnion.LocalRecoverySet := 0; yyusage (usage1, SYSTEM.ADR (xxUnion)); (*  *)
  237.               EXIT;
  238.             END;
  239.             xxExpected (1, 1, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)
  240.           END;
  241.         END;
  242.         EXIT;
  243.       | 1 (* ' ' *), 2 (* '^' *), 3 (* '%' *), 4 (* '$' *), 6 (* '\' *), 7 (* '{' *), 8 (* '}' *), 9 (* nl *), 10 (* bnl *), 11 (* char *), 12 (* tab *):
  244.         xxUnion.LocalRecoverySet := 0; yynormal (normal1, SYSTEM.ADR (xxUnion)); (*  *)
  245.         EXIT;
  246.       ELSE
  247.         IF xxIsRepairMode THEN
  248.           xxUnion.LocalRecoverySet := 0; yynormal (normal1, SYSTEM.ADR (xxUnion)); (*  *)
  249.           EXIT;
  250.         END;
  251.         xxExpected (1, 1, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)
  252.       END;
  253.     END;
  254.   END yyline;
  255.  
  256. PROCEDURE yydefinition (VAR definition0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  257.   VAR
  258.     nl1: Scanner.tScanAttribute;
  259.     char1: Scanner.tScanAttribute;
  260.     bl1, bl2: tParsAttribute;
  261.     text1: tParsAttribute;
  262.     xxUnion: xxtUnion;
  263.   BEGIN
  264.     xxUnion.GlobalRecoverySet := xxGlobalRecoverySet;
  265.     IF xxToken # 5 (* '.' *) THEN
  266.       xxRecoveryLiteral (5, 2, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl char tab *)
  267.     ELSE
  268.       xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  269.     END;
  270.     xxUnion.LocalRecoverySet := 2; yybl (bl1, SYSTEM.ADR (xxUnion)); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl char tab *)
  271.     LOOP
  272.       CASE xxToken OF
  273.       | 11 (* char *):
  274.         char1 := Scanner.Attribute;
  275.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  276.         EXIT;
  277.       | 2 (* '^' *):
  278.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  279. (* 'mpp.ell' line 52 *)
  280.  char1.Ch := '^';        
  281.         EXIT;
  282.       | 3 (* '%' *):
  283.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  284. (* 'mpp.ell' line 53 *)
  285.  char1.Ch := '%';        
  286.         EXIT;
  287.       | 4 (* '$' *):
  288.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  289. (* 'mpp.ell' line 54 *)
  290.  char1.Ch := '$';        
  291.         EXIT;
  292.       | 7 (* '{' *):
  293.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  294. (* 'mpp.ell' line 55 *)
  295.  char1.Ch := '{';        
  296.         EXIT;
  297.       | 8 (* '}' *):
  298.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  299. (* 'mpp.ell' line 56 *)
  300.  char1.Ch := '}';        
  301.         EXIT;
  302.       | 6 (* '\' *):
  303.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  304. (* 'mpp.ell' line 57 *)
  305.  char1.Ch := '\';        
  306.         EXIT;
  307.       ELSE
  308.         IF xxIsRepairMode THEN
  309.           IF xxToken # 11 (* char *) THEN
  310.             xxRecoveryTerminal (11, 3, xxGlobalRecoverySet, char1); (*  ' ' '^' '%' '$' '.' '\' nl char tab *)
  311.           ELSE
  312.             char1 := Scanner.Attribute;
  313.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  314.           END;
  315.           EXIT;
  316.         END;
  317.         xxExpected (2, 2, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl char tab *)
  318.       END;
  319.     END;
  320.     xxUnion.LocalRecoverySet := 3; yybl (bl2, SYSTEM.ADR (xxUnion)); (*  ' ' '^' '%' '$' '.' '\' nl char tab *)
  321. (* 'mpp.ell' line 58 *)
  322.  AssignEmpty (text1);        
  323.     LOOP
  324.       IF (1 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' char tab *)) THEN
  325.         xxUnion.LocalRecoverySet := 6; yytext (text1, SYSTEM.ADR (xxUnion)); (*  nl *)
  326.         EXIT;
  327.       ELSIF (xxToken = 9 (* nl *)) OR xxIsRepairMode THEN EXIT; END;
  328.       xxExpected (3, 3, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' nl char tab /  ' ' '^' '%' '$' '.' '\' nl char tab *)
  329.     END;
  330.     IF xxToken # 9 (* nl *) THEN
  331.       xxRecoveryTerminal (9, 6, xxGlobalRecoverySet, nl1); (*  nl *)
  332.     ELSE
  333.       nl1 := Scanner.Attribute;
  334.       xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  335.     END;
  336. (* 'mpp.ell' line 59 *)
  337.  Define (char1.Ch, text1);    
  338. (* 'mpp.ell' line 60 *)
  339.  NewLine;            
  340.   END yydefinition;
  341.  
  342. PROCEDURE yyusage (VAR usage0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  343.   VAR
  344.     nl1, nl2: Scanner.tScanAttribute;
  345.     bnl1: Scanner.tScanAttribute;
  346.     char1: Scanner.tScanAttribute;
  347.     bl1: tParsAttribute;
  348.     text1: tParsAttribute;
  349.     use1: tParsAttribute;
  350.     xxUnion: xxtUnion;
  351.   BEGIN
  352.     xxUnion.GlobalRecoverySet := xxGlobalRecoverySet;
  353.     LOOP
  354.       CASE xxToken OF
  355.       | 2 (* '^' *), 3 (* '%' *), 4 (* '$' *), 7 (* '{' *), 8 (* '}' *), 11 (* char *):
  356. (* 'mpp.ell' line 65 *)
  357.  AssignEmpty (text1);        
  358.         LOOP
  359.           CASE xxToken OF
  360.           | 11 (* char *):
  361.             char1 := Scanner.Attribute;
  362.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  363.             EXIT;
  364.           | 2 (* '^' *):
  365.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  366. (* 'mpp.ell' line 67 *)
  367.  char1.Ch := '^';        
  368.             EXIT;
  369.           | 3 (* '%' *):
  370.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  371. (* 'mpp.ell' line 68 *)
  372.  char1.Ch := '%';        
  373.             EXIT;
  374.           | 4 (* '$' *):
  375.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  376. (* 'mpp.ell' line 69 *)
  377.  char1.Ch := '$';        
  378.             EXIT;
  379.           | 7 (* '{' *):
  380.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  381. (* 'mpp.ell' line 70 *)
  382.  char1.Ch := '{';        
  383.             EXIT;
  384.           | 8 (* '}' *):
  385.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  386. (* 'mpp.ell' line 71 *)
  387.  char1.Ch := '}';        
  388.             EXIT;
  389.           ELSE
  390.             IF xxIsRepairMode THEN
  391.               IF xxToken # 11 (* char *) THEN
  392.                 xxRecoveryTerminal (11, 3, xxGlobalRecoverySet, char1); (*  ' ' '^' '%' '$' '.' '\' nl char tab *)
  393.               ELSE
  394.                 char1 := Scanner.Attribute;
  395.                 xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  396.               END;
  397.               EXIT;
  398.             END;
  399.             xxExpected (2, 2, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl char tab *)
  400.           END;
  401.         END;
  402.         LOOP
  403.           IF (1 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' char tab *)) THEN
  404.             xxUnion.LocalRecoverySet := 6; yytext (text1, SYSTEM.ADR (xxUnion)); (*  nl *)
  405.             EXIT;
  406.           ELSIF (xxToken = 9 (* nl *)) OR xxIsRepairMode THEN EXIT; END;
  407.           xxExpected (3, 3, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' nl char tab /  ' ' '^' '%' '$' '.' '\' nl char tab *)
  408.         END;
  409.         IF xxToken # 9 (* nl *) THEN
  410.           xxRecoveryTerminal (9, 6, xxGlobalRecoverySet, nl1); (*  nl *)
  411.         ELSE
  412.           nl1 := Scanner.Attribute;
  413.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  414.         END;
  415. (* 'mpp.ell' line 72 *)
  416.  Translate (char1.Ch, text1);    
  417.         EXIT;
  418.       | 1 (* ' ' *), 5 (* '.' *), 6 (* '\' *), 9 (* nl *), 10 (* bnl *), 12 (* tab *):
  419. (* 'mpp.ell' line 73 *)
  420.  BeginLine;            
  421.         xxUnion.LocalRecoverySet := 7; yybl (bl1, SYSTEM.ADR (xxUnion)); (*  ' ' '^' '%' '$' '.' '\' '{' nl bnl char tab *)
  422.         LOOP
  423.           IF (2 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' char tab *)) THEN
  424.             xxUnion.LocalRecoverySet := 8; yyuse (use1, SYSTEM.ADR (xxUnion)); (*  nl bnl *)
  425.           ELSIF (3 IN xxVerticalSet0 [xxToken] (*  nl bnl *)) OR xxIsRepairMode THEN EXIT;
  426.           ELSE
  427.            
  428.           xxExpected (7, 7, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' nl bnl char tab *)
  429.           END;
  430.         END;
  431.         LOOP
  432.           CASE xxToken OF
  433.           | 9 (* nl *):
  434.             nl2 := Scanner.Attribute;
  435.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  436. (* 'mpp.ell' line 74 *)
  437.  CloseLine;            
  438.             EXIT;
  439.           | 10 (* bnl *):
  440.             bnl1 := Scanner.Attribute;
  441.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  442.             EXIT;
  443.           ELSE
  444.             IF xxIsRepairMode THEN
  445.               IF xxToken # 9 (* nl *) THEN
  446.                 xxRecoveryTerminal (9, 6, xxGlobalRecoverySet, nl2); (*  nl *)
  447.               ELSE
  448.                 nl2 := Scanner.Attribute;
  449.                 xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  450.               END;
  451. (* 'mpp.ell' line 74 *)
  452.  CloseLine;            
  453.               EXIT;
  454.             END;
  455.             xxExpected (8, 8, xxGlobalRecoverySet); (*  nl bnl /  nl bnl *)
  456.           END;
  457.         END;
  458.         EXIT;
  459.       ELSE
  460.         IF xxIsRepairMode THEN
  461. (* 'mpp.ell' line 73 *)
  462.  BeginLine;            
  463.           xxUnion.LocalRecoverySet := 7; yybl (bl1, SYSTEM.ADR (xxUnion)); (*  ' ' '^' '%' '$' '.' '\' '{' nl bnl char tab *)
  464.           LOOP
  465.             IF (2 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' char tab *)) THEN
  466.               xxUnion.LocalRecoverySet := 8; yyuse (use1, SYSTEM.ADR (xxUnion)); (*  nl bnl *)
  467.             ELSIF (3 IN xxVerticalSet0 [xxToken] (*  nl bnl *)) OR xxIsRepairMode THEN EXIT;
  468.             ELSE
  469.              
  470.             xxExpected (7, 7, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' nl bnl char tab *)
  471.             END;
  472.           END;
  473.           LOOP
  474.             CASE xxToken OF
  475.             | 9 (* nl *):
  476.               nl2 := Scanner.Attribute;
  477.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  478. (* 'mpp.ell' line 74 *)
  479.  CloseLine;            
  480.               EXIT;
  481.             | 10 (* bnl *):
  482.               bnl1 := Scanner.Attribute;
  483.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  484.               EXIT;
  485.             ELSE
  486.               IF xxIsRepairMode THEN
  487.                 IF xxToken # 9 (* nl *) THEN
  488.                   xxRecoveryTerminal (9, 6, xxGlobalRecoverySet, nl2); (*  nl *)
  489.                 ELSE
  490.                   nl2 := Scanner.Attribute;
  491.                   xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  492.                 END;
  493. (* 'mpp.ell' line 74 *)
  494.  CloseLine;            
  495.                 EXIT;
  496.               END;
  497.               xxExpected (8, 8, xxGlobalRecoverySet); (*  nl bnl /  nl bnl *)
  498.             END;
  499.           END;
  500.           EXIT;
  501.         END;
  502.         xxExpected (1, 1, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)
  503.       END;
  504.     END;
  505. (* 'mpp.ell' line 77 *)
  506.  NewLine;            
  507.   END yyusage;
  508.  
  509. PROCEDURE yynormal (VAR normal0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  510.   VAR
  511.     nl1: Scanner.tScanAttribute;
  512.     bnl1: Scanner.tScanAttribute;
  513.     any1: tParsAttribute;
  514.     xxUnion: xxtUnion;
  515.   BEGIN
  516.     xxUnion.GlobalRecoverySet := xxGlobalRecoverySet;
  517.     LOOP
  518.       IF (4 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' '}' char tab *)) THEN
  519.         xxUnion.LocalRecoverySet := 8; yyany (any1, SYSTEM.ADR (xxUnion)); (*  nl bnl *)
  520. (* 'mpp.ell' line 82 *)
  521.  WriteLine (any1);        
  522.         EXIT;
  523.       ELSIF (3 IN xxVerticalSet0 [xxToken] (*  nl bnl *)) OR xxIsRepairMode THEN EXIT; END;
  524.       xxExpected (1, 1, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)
  525.     END;
  526.     LOOP
  527.       CASE xxToken OF
  528.       | 9 (* nl *):
  529.         nl1 := Scanner.Attribute;
  530.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  531.         EXIT;
  532.       | 10 (* bnl *):
  533.         bnl1 := Scanner.Attribute;
  534.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  535. (* 'mpp.ell' line 85 *)
  536.  WriteC ('\');            
  537.         EXIT;
  538.       ELSE
  539.         IF xxIsRepairMode THEN
  540.           IF xxToken # 9 (* nl *) THEN
  541.             xxRecoveryTerminal (9, 6, xxGlobalRecoverySet, nl1); (*  nl *)
  542.           ELSE
  543.             nl1 := Scanner.Attribute;
  544.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  545.           END;
  546.           EXIT;
  547.         END;
  548.         xxExpected (8, 8, xxGlobalRecoverySet); (*  nl bnl /  nl bnl *)
  549.       END;
  550.     END;
  551. (* 'mpp.ell' line 86 *)
  552.  NewLine;            
  553.   END yynormal;
  554.  
  555. PROCEDURE yybl (VAR bl0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  556.   VAR
  557.     tab1: Scanner.tScanAttribute;
  558.   BEGIN
  559.     LOOP
  560.       IF (5 IN xxVerticalSet0 [xxToken] (*  ' ' tab *)) THEN
  561.         IF (xxToken = 1 (* ' ' *)) THEN
  562.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  563.         ELSE 
  564.           tab1 := Scanner.Attribute;
  565.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  566.         END;
  567.       ELSIF (0 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)) OR xxIsRepairMode THEN EXIT;
  568.       ELSE
  569.        
  570.       xxExpected (10, 10, xxGlobalRecoverySet); (*  ' ' tab /  ' ' tab *)
  571.       END;
  572.     END;
  573.   END yybl;
  574.  
  575. PROCEDURE yyuse (VAR use0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  576.   VAR
  577.     char1: Scanner.tScanAttribute;
  578.     bl1: tParsAttribute;
  579.     text1: tParsAttribute;
  580.     xxUnion: xxtUnion;
  581.   BEGIN
  582.     xxUnion.GlobalRecoverySet := xxGlobalRecoverySet;
  583.     LOOP
  584.       CASE xxToken OF
  585.       | 7 (* '{' *):
  586.         xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  587.         LOOP
  588.           CASE xxToken OF
  589.           | 11 (* char *):
  590.             char1 := Scanner.Attribute;
  591.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  592.             EXIT;
  593.           | 2 (* '^' *):
  594.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  595. (* 'mpp.ell' line 97 *)
  596.  char1.Ch := '^';        
  597.             EXIT;
  598.           | 3 (* '%' *):
  599.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  600. (* 'mpp.ell' line 98 *)
  601.  char1.Ch := '%';        
  602.             EXIT;
  603.           | 4 (* '$' *):
  604.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  605. (* 'mpp.ell' line 99 *)
  606.  char1.Ch := '$';        
  607.             EXIT;
  608.           | 7 (* '{' *):
  609.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  610. (* 'mpp.ell' line 100 *)
  611.  char1.Ch := '{';        
  612.             EXIT;
  613.           | 8 (* '}' *):
  614.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  615. (* 'mpp.ell' line 101 *)
  616.  char1.Ch := '}';        
  617.             EXIT;
  618.           | 6 (* '\' *):
  619.             xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  620. (* 'mpp.ell' line 102 *)
  621.  char1.Ch := '\';        
  622.             EXIT;
  623.           ELSE
  624.             IF xxIsRepairMode THEN
  625.               IF xxToken # 11 (* char *) THEN
  626.                 xxRecoveryTerminal (11, 14, xxGlobalRecoverySet, char1); (*  ' ' '^' '%' '$' '.' '\' '}' char tab *)
  627.               ELSE
  628.                 char1 := Scanner.Attribute;
  629.                 xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  630.               END;
  631.               EXIT;
  632.             END;
  633.             xxExpected (13, 13, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' char tab *)
  634.           END;
  635.         END;
  636. (* 'mpp.ell' line 103 *)
  637.  AssignEmpty (text1);        
  638.         xxUnion.LocalRecoverySet := 14; yybl (bl1, SYSTEM.ADR (xxUnion)); (*  ' ' '^' '%' '$' '.' '\' '}' char tab *)
  639.         LOOP
  640.           IF (1 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' char tab *)) THEN
  641.             xxUnion.LocalRecoverySet := 15; yytext (text1, SYSTEM.ADR (xxUnion)); (*  '}' *)
  642.             EXIT;
  643.           ELSIF (xxToken = 8 (* '}' *)) OR xxIsRepairMode THEN EXIT; END;
  644.           xxExpected (14, 14, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '}' char tab /  ' ' '^' '%' '$' '.' '\' '}' char tab *)
  645.         END;
  646.         IF xxToken # 8 (* '}' *) THEN
  647.           xxRecoveryLiteral (8, 15, xxGlobalRecoverySet); (*  '}' *)
  648.         ELSE
  649.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  650.         END;
  651. (* 'mpp.ell' line 104 *)
  652.  Translate (char1.Ch, text1);    
  653.         EXIT;
  654.       | 1 (* ' ' *), 2 (* '^' *), 3 (* '%' *), 4 (* '$' *), 5 (* '.' *), 6 (* '\' *), 11 (* char *), 12 (* tab *):
  655.         xxUnion.LocalRecoverySet := 0; yytext (text1, SYSTEM.ADR (xxUnion)); (*  *)
  656. (* 'mpp.ell' line 105 *)
  657.  Translate ('%', text1);    
  658.         EXIT;
  659.       ELSE
  660.         IF xxIsRepairMode THEN
  661.           xxUnion.LocalRecoverySet := 0; yytext (text1, SYSTEM.ADR (xxUnion)); (*  *)
  662. (* 'mpp.ell' line 105 *)
  663.  Translate ('%', text1);    
  664.           EXIT;
  665.         END;
  666.         xxExpected (16, 16, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' char tab /  ' ' '^' '%' '$' '.' '\' '{' char tab *)
  667.       END;
  668.     END;
  669.   END yyuse;
  670.  
  671. PROCEDURE yytext (VAR text0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  672.   VAR
  673.     char1: Scanner.tScanAttribute;
  674.     tab1, tab2: Scanner.tScanAttribute;
  675.   BEGIN
  676. (* 'mpp.ell' line 109 *)
  677.  AssignEmpty (text0);        
  678.     LOOP
  679.       LOOP
  680.         CASE xxToken OF
  681.         | 1 (* ' ' *):
  682.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  683. (* 'mpp.ell' line 110 *)
  684.  Append (text0, ' ');        
  685.           EXIT;
  686.         | 2 (* '^' *):
  687.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  688. (* 'mpp.ell' line 111 *)
  689.  Append (text0, '^');        
  690.           EXIT;
  691.         | 3 (* '%' *):
  692.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  693. (* 'mpp.ell' line 112 *)
  694.  Append (text0, '%');        
  695.           EXIT;
  696.         | 4 (* '$' *):
  697.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  698. (* 'mpp.ell' line 113 *)
  699.  Append (text0, '$');        
  700.           EXIT;
  701.         | 5 (* '.' *):
  702.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  703. (* 'mpp.ell' line 114 *)
  704.  Append (text0, '.');        
  705.           EXIT;
  706.         | 11 (* char *):
  707.           char1 := Scanner.Attribute;
  708.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  709. (* 'mpp.ell' line 115 *)
  710.  Append (text0, char1.Ch);    
  711.           EXIT;
  712.         | 12 (* tab *):
  713.           tab1 := Scanner.Attribute;
  714.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  715. (* 'mpp.ell' line 116 *)
  716.  Append (text0, cTab);        
  717.           EXIT;
  718.         | 6 (* '\' *):
  719.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  720. (* 'mpp.ell' line 117 *)
  721.  Append (text0, '\');        
  722.           LOOP
  723.             CASE xxToken OF
  724.             | 6 (* '\' *):
  725.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  726. (* 'mpp.ell' line 118 *)
  727.  Append (text0, '\');        
  728.               EXIT;
  729.             | 7 (* '{' *):
  730.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  731. (* 'mpp.ell' line 119 *)
  732.  Append (text0, '{');        
  733.               EXIT;
  734.             | 8 (* '}' *):
  735.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  736. (* 'mpp.ell' line 120 *)
  737.  Append (text0, '}');        
  738.               EXIT;
  739.             | 1 (* ' ' *):
  740.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  741. (* 'mpp.ell' line 121 *)
  742.  Append (text0, ' ');        
  743.               EXIT;
  744.             | 12 (* tab *):
  745.               tab2 := Scanner.Attribute;
  746.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  747. (* 'mpp.ell' line 122 *)
  748.  Append (text0, cTab);        
  749.               EXIT;
  750.             ELSE
  751.               IF xxIsRepairMode THEN
  752.                 IF xxToken # 6 (* '\' *) THEN
  753.                   xxRecoveryLiteral (6, 24, xxGlobalRecoverySet); (*  '\' *)
  754.                 ELSE
  755.                   xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  756.                 END;
  757. (* 'mpp.ell' line 118 *)
  758.  Append (text0, '\');        
  759.                 EXIT;
  760.               END;
  761.               xxExpected (23, 23, xxGlobalRecoverySet); (*  ' ' '\' '{' '}' tab /  ' ' '\' '{' '}' tab *)
  762.             END;
  763.           END;
  764.           EXIT;
  765.         ELSE
  766.           IF xxIsRepairMode THEN
  767.             IF xxToken # 1 (* ' ' *) THEN
  768.               xxRecoveryLiteral (1, 11, xxGlobalRecoverySet); (*  ' ' *)
  769.             ELSE
  770.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  771.             END;
  772. (* 'mpp.ell' line 110 *)
  773.  Append (text0, ' ');        
  774.             EXIT;
  775.           END;
  776.           xxExpected (17, 17, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' char tab /  ' ' '^' '%' '$' '.' '\' char tab *)
  777.         END;
  778.       END;
  779.       IF NOT ((1 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' char tab *))) THEN
  780.         IF (0 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' '}' nl bnl char tab *)) THEN EXIT; END;
  781.         xxExpected (17, 17, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' char tab /  ' ' '^' '%' '$' '.' '\' char tab *)
  782.         IF NOT ((1 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' char tab *))) THEN EXIT; END;
  783.       END;
  784.     END;
  785.   END yytext;
  786.  
  787. PROCEDURE yyany (VAR any0: tParsAttribute; xxGlobalRecoverySet: xxtUnionPtr);
  788.   VAR
  789.     char1: Scanner.tScanAttribute;
  790.     tab1: Scanner.tScanAttribute;
  791.   BEGIN
  792. (* 'mpp.ell' line 127 *)
  793.  AssignEmpty (any0);        
  794.     LOOP
  795.       LOOP
  796.         CASE xxToken OF
  797.         | 1 (* ' ' *):
  798.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  799. (* 'mpp.ell' line 128 *)
  800.  Append (any0, ' ');        
  801.           EXIT;
  802.         | 2 (* '^' *):
  803.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  804. (* 'mpp.ell' line 129 *)
  805.  Append (any0, '^');        
  806.           EXIT;
  807.         | 3 (* '%' *):
  808.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  809. (* 'mpp.ell' line 130 *)
  810.  Append (any0, '%');        
  811.           EXIT;
  812.         | 4 (* '$' *):
  813.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  814. (* 'mpp.ell' line 131 *)
  815.  Append (any0, '$');        
  816.           EXIT;
  817.         | 5 (* '.' *):
  818.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  819. (* 'mpp.ell' line 132 *)
  820.  Append (any0, '.');        
  821.           EXIT;
  822.         | 6 (* '\' *):
  823.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  824. (* 'mpp.ell' line 133 *)
  825.  Append (any0, '\');        
  826.           EXIT;
  827.         | 7 (* '{' *):
  828.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  829. (* 'mpp.ell' line 134 *)
  830.  Append (any0, '{');        
  831.           EXIT;
  832.         | 8 (* '}' *):
  833.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  834. (* 'mpp.ell' line 135 *)
  835.  Append (any0, '}');        
  836.           EXIT;
  837.         | 11 (* char *):
  838.           char1 := Scanner.Attribute;
  839.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  840. (* 'mpp.ell' line 136 *)
  841.  Append (any0, char1.Ch);    
  842.           EXIT;
  843.         | 12 (* tab *):
  844.           tab1 := Scanner.Attribute;
  845.           xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  846. (* 'mpp.ell' line 137 *)
  847.  Append (any0, cTab);        
  848.           EXIT;
  849.         ELSE
  850.           IF xxIsRepairMode THEN
  851.             IF xxToken # 1 (* ' ' *) THEN
  852.               xxRecoveryLiteral (1, 11, xxGlobalRecoverySet); (*  ' ' *)
  853.             ELSE
  854.               xxToken := Scanner.GetToken (); xxIsRepairMode := FALSE;
  855.             END;
  856. (* 'mpp.ell' line 128 *)
  857.  Append (any0, ' ');        
  858.             EXIT;
  859.           END;
  860.           xxExpected (13, 13, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' char tab *)
  861.         END;
  862.       END;
  863.       IF NOT ((4 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' '}' char tab *))) THEN
  864.         IF (3 IN xxVerticalSet0 [xxToken] (*  nl bnl *)) THEN EXIT; END;
  865.         xxExpected (13, 13, xxGlobalRecoverySet); (*  ' ' '^' '%' '$' '.' '\' '{' '}' char tab /  ' ' '^' '%' '$' '.' '\' '{' '}' char tab *)
  866.         IF NOT ((4 IN xxVerticalSet0 [xxToken] (*  ' ' '^' '%' '$' '.' '\' '{' '}' char tab *))) THEN EXIT; END;
  867.       END;
  868.     END;
  869.   END yyany;
  870.  
  871. BEGIN
  872.   xxIsInitialized := FALSE;
  873.   ParsTabName := 'Parser.Tab';
  874. END Parser.
  875.